﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BL.Entities;
using System.Configuration;
using BL;

namespace EF
{
    public class FSEntitiesRepository
    {
        private FSDBContext context;
        public FSEntitiesRepository()
        {
            context = new FSDBContext(ConfigurationManager.ConnectionStrings[0].ConnectionString);
        }


        //Тут нужно поставить что б корнеевая папка для юзера грузилась

        public IEnumerable<FileSystemEntite> GetFilesFoldersListById(int parentId)
        {
            IEnumerable<FileSystemEntite> query1 = context.File.Where(x => x.ParentId == parentId).ToList();
            IEnumerable<FileSystemEntite> query2 = context.Folder.Where(y => y.ParentId == parentId).ToList();
            return query2.Union(query1);




        }

        public IEnumerable<Folder> GetFolders(int parentFolderId)
        {
            return context.Folder.Where(y => y.ParentId == parentFolderId).ToList();

        }

        public IEnumerable<File> GetFiles(int parentFolderId)         
        {
            return context.File.Where(x => x.ParentId == parentFolderId).ToList();
        }

       

        public Folder GetFoldersById(int Id)
        {
            return context.Folder.FirstOrDefault(x => x.Id == Id);
        }

        public File GetFileById(int Id)
        {
            return context.File.FirstOrDefault(x => x.Id == Id);
        }



        public File GetFileBySharingLink(string sharingLink)
        {
            return context.File.FirstOrDefault(x => x.LinkForSharing == sharingLink);
        }

        public Folder GetFolderBySharingLink(string sharingLink)
        {
            return context.Folder.FirstOrDefault(x => x.LinkForSharing == sharingLink);
        }



        public Folder GetParentFoldersById(int Id)
        {
            Folder tempF = context.Folder.FirstOrDefault(a => a.Id == Id);
            return context.Folder.FirstOrDefault(x => x.Id == tempF.ParentId);
        }


     
        public bool IsExistRootFolder (string name)
        {
           if (context.UserProfile.FirstOrDefault(x => x.Email == name).RootFolderId != null) return true;
            else return false;
        }

        public void CreateRootFolder(string userName)
        {
          context.Folder.Add(new Folder() { DateCreate = DateTime.Now.Date, DateUpdate = DateTime.Now.Date, Name = userName + "_Folder", Owner = userName, ParentId = 0, PhysicalPath="VertualFolder"});
          context.SaveChanges();
          Folder newFolder = context.Folder.FirstOrDefault(x => x.Owner == userName && x.Name == userName + "_Folder");
          int NewRootId = newFolder.Id;
          UserProfile usp = context.UserProfile.FirstOrDefault(x => x.Email == userName);
          usp.RootFolderId = NewRootId;
          context.SaveChanges();          
        }



        #region Создание\Удаление шаринговых сылох
        
        //Создание сылки для шарингового файла
        public bool CreateFileSharedLink(int id, string sharedLink)
        {
            File usp = context.File.FirstOrDefault(x => x.Id == id);
            usp.LinkForSharing = sharedLink;
            context.SaveChanges();
            return true;
        }

        //Удаление сылки шарингового файла
        public bool DeleteFileSharedLink(int id)
        {
            File usp = context.File.FirstOrDefault(x => x.Id == id);
            usp.LinkForSharing = null;
            context.SaveChanges();
            return true;
        }




        //Создание сылки для шаринговой папки
        public bool CreateFolderSharedLink(int id, string sharedLink)
        {
            Folder usp = context.Folder.FirstOrDefault(x => x.Id == id);
            usp.LinkForSharing = sharedLink;
            context.SaveChanges();
            return true;
        }

        //Удаление сылки шаринговой папки
        public bool DeleteFolderSharedLink(int id)
        {
            Folder usp = context.Folder.FirstOrDefault(x => x.Id == id);
            usp.LinkForSharing = null;
            context.SaveChanges();
            return true;
        }


        public string GetLinkForSharedFolder(int id)
        {
            Folder usp = context.Folder.FirstOrDefault(x => x.Id == id);
            return usp.LinkForSharing;
        }
        public string GetLinkForSharedFile(int id)
        {
            File usp = context.File.FirstOrDefault(x => x.Id == id);
            return usp.LinkForSharing;
        }



#endregion




        //запись файлов в бд
        public void WriteFiles(File file) 
        {

            context.File.Add(file);
            context.SaveChanges();
        }
        
        
        //Увиличиваем значение занимаемого польозователем при добавлении файлов
        public void IncrimentStorageCapacity(decimal size, string userName)
        {
            UserProfile up = context.UserProfile.FirstOrDefault(x => x.Email == userName);
            up.StorageCapacity += size;
            context.SaveChanges();
        }
        //Уменшает значение занимаемого польозователем места при удалении файлов
        public void DecrementStorageCapacity(int fileId, string userName)
        {
            File file = context.File.FirstOrDefault(x => x.Id == fileId);
            UserProfile up = context.UserProfile.FirstOrDefault(x => x.Email == userName);

            up.StorageCapacity -= file.Size;
            context.SaveChanges();
        }
     





        public void CreateFolder(Folder folder) 
        {
            context.Folder.Add(folder);
            context.SaveChanges();
        }        


        public int GetRootId(string userName)
        {
            return Convert.ToInt32(context.UserProfile.FirstOrDefault(x => x.Email == userName).RootFolderId);
           
        }


        public int GetAllowedCapacity(string userName)
        {
            decimal temp = Convert.ToDecimal(context.UserProfile.FirstOrDefault(x => x.Email == userName).AllowedCapacity)/1024/1024;
            return Convert.ToInt32(temp);
        }
        public int GetStorageCapacity(string userName)
        {
            decimal temp = Convert.ToDecimal(context.UserProfile.FirstOrDefault(x => x.Email == userName).StorageCapacity) / 1024 / 1024;
            return Convert.ToInt32(temp);
        }


        //удаление файлов

        public bool DeleteFile(int fileId) 
        {
            File file = context.File.FirstOrDefault(f=>f.Id==fileId);
            if(file!=null)
            {
                context.File.Remove(file);
                context.SaveChanges();
                return true;
            }
            
            return false;
        }

        public bool DeleteFolder(int folderId) 
        {
            Folder fol = context.Folder.FirstOrDefault(f => f.Id == folderId);
            if (fol != null) 
            {
                context.Folder.Remove(fol);
                context.SaveChanges();
                return true;
            }
            return false;
        }

        //переименовывание
        public bool writeFileName(int id, string name) {
            File file = GetFileById(id);
            if (file != null)
            {
                file.Name = name;
                file.DateUpdate = DateTime.Now.Date;
                context.SaveChanges();
                return true;
            }
            
            return false;
        }
        public bool writeFolderName(int id, string name)
        {
            Folder folder = GetFoldersById(id);
            if (folder != null) 
            {
                folder.Name = name;
                folder.DateUpdate = DateTime.Now.Date;
                context.SaveChanges();
                return true;
            }
            return false;
        }

        //NEWWWWWWWWWWWWWWWWWWWWWWW
       

        public List<FileForZip> GetStructOfFilesByParentId(int id, List<FileForZip> ffz, string nameOfParentFolder)
        {
            Folder temp = context.Folder.FirstOrDefault(x => x.Id == id);
            nameOfParentFolder = nameOfParentFolder + @"\";

            var query1 = context.File.Where(x => x.ParentId == id).ToList();
            foreach(File file in query1)
            {
                ffz.Add(new FileForZip() { name = nameOfParentFolder + file.Name, physicalPath = file.PhysicalPath, extension = file.Extension });

            }

            var query2 = context.Folder.Where(y => y.ParentId == id).ToList();
            if (query2!=null)
            {
                foreach (Folder fld in query2)
                {
                    GetStructOfFilesByParentId(fld.Id, ffz, nameOfParentFolder+fld.Name);

                }
            }
            return ffz;
            }
        



    }
}